原文发表于 2013-05-09,我的豆瓣日记,摘自我发给女朋友的邮件。
我想了想,或许这种方式更容易表达和方便理解。
你说,当看完那本书之后,对你的三观颠覆很大,对“软件”的认识改变了很多,更进一步的甚至对整个IT业界都要进行重新认识了。
我体会得到知道你当时的感受,人的发展就是一个不断发现并否定自我认识的过程,所以,你现在所经历的阶段,我也曾有过,也曾困惑过,也曾一个人梳理了很久才得出一些本来浅显的结论。
我们是“软件工程”专业,照理说,本就应该对IT学界和业界有一个理性的认识的,可是,常常这方面就是容易被忽略的而且非常重要的一部分。我们暂时无法干涉关于专业内容设置这方面的东西,所以这些被忽略了的内容就由我来给你补上吧。
接下来的东西会有点枯燥,但我尽量往形象和生动了那边去靠,每看一段可以停下来想一想,然后再对比一下,最好能够反馈给我你的感受。
我们先从基本的定义开始。
我们是“软件工程”(Software Engineering)专业,肯定所学习、研究和实践的方向都是围绕着“软件”(Software)来。而在了解这方面的概念的时候,经常会有一些东西容易弄混:软件(Software)、应用(Application,特别是在智能手机上比较常用,通常称为App)和程序(Program),区分清楚这三项东西,是非常必要的。
说到“软件”,必然有着跟其对应的“硬件”(Hardware),而用现在最基本的脚趾头也能够理解到,硬件必然是软件的基础,所以,我们的根源就追溯到了硬件。
总体说来硬件其实就是一堆电子元器件和支撑起这些电子元器件的物理材料的总和,当然,这些元器件是要符合一定的数学和物理规律的,这一堆东西,就是组成一台计算机的硬件。而加上适当的电压之后,计算机硬件就正常通电工作了。
顾名思义,“计算机”的功能就是用来“计算”的,计算是需要规则的。所以,计算机硬件能够正常工作并不是我们想要的结果,而更希望能够让他们按照我们制定的规则来工作,我们可以直接命令他们进行何种处理、合适启动和停止计算等等,于是就需要通过一种能够让我们和计算机硬件进行交互沟通的“语言”来更好的完成这方面的任务,这种语言就叫做“指令”(Instruction)。
可是指令只能让计算机硬件执行一些简单的任务,而一个复杂的任务可能由许多的简单任务构成,所以就需要一系列的指令来完成,这样子用于完成一个特定任务的指令序列,就叫做程序(Program),而设计这一套指令系列的过程,就叫做“编程”(Programming)。
那么什么是软件呢?
现代计算机是需要通电才能工作的,而由于其内部设计及实现的原因,整体的运行及控制也离不开电流(至于跟“电”相关的概念,要涉及到物理学的内容,暂时不纠结),所以对其进行控制的指令(Instruction)也要通过电信号来实现,而这一些电信号是我们不可读不可见的,只有计算机硬件才能够理解他们是什么内容,这些只能够由机器才能理解的电信号就是软件(Software)。当然,由于电信号是可以跟其他形式的信号转换,所以我们可以看到软件可以保存在其他各种介质中,比如打孔卡、磁盘、光盘、闪存,甚至是DNA。但是,这些介质只是物理层面上的东西,并不能说它们就是软件。
程序是指令序列,软件是指令集合,只不过软件的指令是只能由特定的计算机硬件才能识别的,而程序的某些形式却是人类可读的,所以,软件只是程序的一种存在形式,是为了能够让计算机理解和执行的程序。
认识到什么是软件之后,接下来就该认识不同类型的软件了。
首先,有这么两大类,一类是让计算机硬件能够维持正常的稳定的运行和工作的,他们和计算机硬件一起构成了一个稳定的系统,我们称之为系统软件(System Software);另外一类,就是在系统软件之上执行特定的(有用的)计算任务的软件,我们称之为应用软件(Application Software)。因为要执行除了维持计算机执行之外的其他任务,是拥有特定领域需求并且要被应用(apply)在特定领域的,这就是他名字的由来。至于都有哪些领域,维基百科给出了一个非常长的列表,应该比较方便理解。同样,智能手机上的App如此丰富,也应该某种程度上体现了“应用”的多样性。
这里出现了几个值得细推敲的地方。
第一,软件和硬件的关系。
因为软件本身就是依赖于硬件服务于硬件的,所以,即便是研究软件,也不能脱离对硬件的理解,否则就是舍本求末了。
第二,软件和程序的关系。
上面提到的观点是“软件是程序的某种特殊存在形式”。
第三,数据。
我们回到最开始。
为什么说SNS也是软件?
因为它以指令(电信号)的形式控制服务器和客户端工作,通过网络线缆(或者是无线通信链路)等以某种形式传输数字信号来让客户端跟服务器连通,从而实现信息的社会化传播与分享。 控制机器来实现某种特定(有用)功能的信号,根据定义,就是软件。
可是,软件工程又是用来做什么的呢?
下一封邮件会继续讲的。